//
//  R-ValueReferance.hpp
//  learnC++
//
//  Created by liuzhibing on 2018/6/26.
//  Copyright © 2018年 yunfan.com. All rights reserved.
//

#ifndef R_ValueReferance_hpp
#define R_ValueReferance_hpp

#include <stdio.h>
#include <iostream>

class Fraction5 {
private:
    int m_numerator;
    int m_denominator;
    
public:
    Fraction5(int numerator = 0, int denominator = 1) :
    m_numerator(numerator), m_denominator(denominator)
    {
    }
    
    friend std::ostream& operator<<(std::ostream& out, const Fraction5 &f1)
    {
        out << f1.m_numerator << "/" << f1.m_denominator;
        return out;
    }
    
    //r-value常用语函数重载如：
    void fun(const int &lref){
        std::cout << "l-value referance to const\n";
    }
    
    void fun(int &&lref){
        std::cout << "r-value referance to const\n";
    }
    
};

/*
作为匿名对象，Fraction（3,5）通常会在定义表达式的末尾超出范围。 但是，由于我们正在使用它初始化一个r值引用，所以它的持续时间会延长到块的结尾。
 Fraction5 &&rref = Fraction5(3,5);
 std::cout << rref << '\n';
 
 虽然使用字面值初始化r值引用似乎很奇怪，然后可以更改该值，但在使用文字初始化r值时，会从文字构造一个临时值，以便引用引用临时值 对象，而不是文字值。
 int &&rref = 5;
 rref = 10;
 std::cout << rref;
 */


#endif /* R_ValueReferance_hpp */
